perm filename COLMS.SAI[PUB,TES]1 blob sn#129296 filedate 1974-11-03 generic text, type T, neo UTF8
00100	BEGOF("COLMS")
00200	COMMENT
00300	
00400	This module handles columns, groups, and margins.
00500	
00600	Each area instantiation record owns a two-dimensional array of
00700	dimensions 2*columns by maxlines.  AA[1:COLS,*] contain the legs of
00800	the COLS columns, and AA[COLS+1:COLS+COLS,*] contain the feet.  The
00900	entry in AA is (if nonzero) an index into a MOLES array for the page
01000	(MObility of LinES), in which bits are set to indicate that certain
01100	lines must move with others in a group.  Little use is made of these
01200	bits, for they were included for the unimplemented BOX FRAME feature.
01300	
01400	There are also global variables GROUPM indicating that GROUP Mode is
01500	activated, and GLINEM which is the MOLES index of the first line in
01600	the current group (if it has been determined).
01700	
01800	The current margin settings are in global variables LMARG and RMARG.
01900	When area-switching occurs, the current margins are stuffed into the
02000	area declaration record.  When the margins of the current area are
02100	changed for the first time in a block, the old margin values are
02200	stacked on ISTK in a MARGTYPE record., thus, at END of block, the
02300	margins of all areas can be restored.  Further complication is caused
02400	by NARROW-WIDEN nests, which behave like blocks but with their own
02500	save-restore code (they should never have been implemented).
02600	
02700	;
02800	
02900	PROCEDURES
     

00100	PUBLIC INTEGER SIMPLE PROCEDURE COLSLEFT ;$"#
00200	IF COL = 0 THEN RETURN(COLS)
00300	ELSE	BEGIN
00400		INTEGER COUNT, COLUMN ;	COUNT ← 0 ;
00500		FOR COLUMN ← (COL - 1) MOD COLS + 1 THRU COLS DO
00600			IF AA[COLUMN, 0] = 0 AND AA[COLUMN+COLS,0] = 0 THEN COUNT ← COUNT + 1 ;
00700		RETURN(COUNT-(IF LINESLEFT<0 THEN 1 ELSE 0)) ;
00800		END "COLSLEFT" ;
     

00100	PUBLIC SIMPLE PROCEDURE DAPART ;$"#
00200	IF ON THEN
00300	BEGIN "DAPART"
00400	DBREAK ; GLINEM ← 0 ; COMMENT ← TES 4/25/73 ; IF GROUPM=0 THEN RETURN ;
00500	IF MOLESIDA THEN DPB(0,BELOWM(OLX)) ; GROUPM←0 ;
00600	END "DAPART" ;
     

00100	PUBLIC SIMPLE PROCEDURE DMARGINS(BOOLEAN INWARD) ;$"#
00200	BEGIN
00300	STRING S ; INTEGER L, R, W, ARIX, OLDIX, NEWIX ;
00400	IF ON THEN DBREAK ;
00500	ARIX ← IF AREAIXM THEN AREAIXM ELSE IXTEXT ; OLDIX ← MARGINS(ARIX) ; PASS ;
00600	S ← IF THISTYPE > INTERNTYPE OR THISTYPE=-TERQ OR NEXTSCH(←) OR NEXTSCH(:) THEN NULL
00700	    ELSE E(NULL, NULL) ;
00800	IF FULSTR(S) OR ITSCH(<,>) THEN
00900		BEGIN "HAS PARAMS"
01000		L ← IF FULSTR(S) THEN CVD(S) ELSE 0 ;
01100		IF ITSCH(<,>) THEN BEGIN PASS ; R ← CVD(E("0",NULL)) END ELSE R ← 0 ;
01200		IF  NOT ON THEN RETURN ;
01300		MARGINS(ARIX) ← NEWIX ← PUSHI(MARGWDS, MARGTYPE) ;  W ← COLWID(ARIX) ;
01400		LMARG ← (IF OLDIX THEN LMARGX(OLDIX) ELSE 0) + INWARD*L MAX 0 MIN W-1 ;
01500		RMARG ← (IF OLDIX THEN RMARGX(OLDIX) ELSE W) - INWARD*R MIN W MAX LMARG+1 ;
01600		LMARGX(NEWIX) ← LMARG ; RMARGX(NEWIX) ← RMARG ;
01700		AREAX(NEWIX) ← ARIX ; OLD!MARGX(NEWIX) ← OLDIX ;
01800		END "HAS PARAMS"
01900	ELSE IF  NOT ON THEN RETURN
02000	ELSE IF OLDIX THEN
02100		BEGIN "UNNEST"
02200		AREAX(OLDIX) ← 0 ; comment, so ENDBLOCK won't use it ;
02300		MARGINS(ARIX) ← NEWIX ← OLD!MARGX(OLDIX) ;
02400		LMARG ← IF NEWIX THEN LMARGX(NEWIX) ELSE 0 ;
02500		RMARG ← IF NEWIX THEN RMARGX(NEWIX) ELSE COLWID(ARIX) ;
02600		IF OLDIX = IHED THEN IHED ← IHED - 1 - MARGWDS ;
02700		END "UNNEST"
02800	ELSE WARN("=","Extra "&(IF INWARD>0 THEN "NARROW" ELSE "WIDEN")&" in Margin Nest") ;
02900	END "DMARGINS" ;
     

00100	PUBLIC RECURSIVE BOOLEAN PROCEDURE MOVEGROUP(BOOLEAN OFFPAGE ; INTEGER TOCOL, TOLINE, EXTRA) ;$"#
00200	BEGIN "MOVEGROUP"
00300	INTEGER SAVEAREA, LFOOT, PFOOT, FOOL, C, L, L1, L2, F, TC, TL, X ;
00400	IF  NOT OFFPAGE THEN
00500		IF COL LEQ COLS<TOCOL OR TOCOL>2*COLS THEN BEGIN OFFPAGE←TRUE ; TOCOL ← IF COL>COLS THEN COLS+1 ELSE 1 END ;
00600	IF OFFPAGE THEN
00700		BEGIN "OTHER PAGE"
00800		SAVEAREA ← IF AREAIXM THEN LDB(BIXNUM(AREAIXM)) ELSE SYMTEXT ;
00900		GRPTOP ← OLX ; GRPOLX ← GLINEM ; GLINEM ← 0 ; CLOSEAREA(AREAIXM, FALSE) ;
01000		MOLES[0]←OLX ; OPENFRAME ; IDASSIGN(NEWPGIDA←FRAMEIDA, NEWPAGE) ;
01100		IDASSIGN(MOLESF, NMOLES) ; IDASSIGN(SHORTF, NSHORT) ;
01150		SIDASSIGN(OWLSF, NOWLS) ; IDASSIGN(MLEADF, NMLEAD) ; TES 11/2/74 MILL LEADING;
01200		NOLX ← 0 ; TES 1/15/74 0 WAS OLX ; FIXFRAME(OLDPGIDA) ;
01300		NEXTCOUNTER(SYMPAGE,IXPAGE) ;
01350		NMOLES[0]←NSHORT[0]←NMLEAD[0]←NOLX;
01400		FIXFRAME(NEWPGIDA) ; IDASSIGN(OLDPGIDA←NEWPGIDA, OLDPAGE) ;
01500		F ← ARF ;
01600		WHILE F DO
01700			BEGIN
01800			IDASSIGN(AREAIDA←F, THISAREA) ; F ← ARA ;
01900			IF (X ← DEFA) THEN
02000				BEGIN OLD!ACTIVE(X)←NEW!ACTIVE(X); NEW!ACTIVE(X)←0 END ;
02100			END ;
02200		NEWPGIDA ← 0 ; OPENAREA(LDB(IXN(SAVEAREA))) ;
02300		IF FINDTRAN(SYMPAGE,4) THEN RESPOND(LLTHIS) ;
02400		IF TOCOL > COLS THEN BEGIN COL SWAP PAL ; LINE SWAP PINE END ;
02500		END "OTHER PAGE"
02600	ELSE	BEGIN "SAME PAGE"
02700		GRPOLX ← GLINEM ; LFOOT ← 0 ; FOOL ← IF PAL>COL THEN PINE ELSE LINE ;
02800		PFOOT ← IF FOOL=0 THEN 0 ELSE IF LDB(FOOTM(AA[PAL MAX COL,FOOL]))=31 THEN 30 ELSE 0;
02900		FOR C ← COL, PAL DO
03000			BEGIN
03100			L1 ← 1 ; L2 ← IF C = COL THEN LINE ELSE PINE ;
03200			TC ← IF C=COL THEN TOCOL ELSE (TOCOL+COLS-1) MOD (2*COLS) + 1 ;
03300			TL ← IF C=COL THEN TOLINE-1 ELSE RH(AA[TC,0]) ;
03400			F ← IF C LEQ COLS THEN LFOOT ELSE PFOOT ;
03500			FOR L ← L1 THRU L2 DO IF (X ← AA[C,L]) GEQ GRPOLX THEN
03600				BEGIN
03700				AA[TC, TL ← TL + 1] ← X ; AA[C, L] ← 0 ;
03800				IF LDB(FOOTM(X)) THEN DPB(F←IF F=31 THEN 1 ELSE F+1, FOOTM(X)) ;
03900				END ;
04000			IF C= COL THEN BEGIN LINE ← TL ; COL ← TC END ELSE BEGIN PINE ← TL ; PAL ← TC END ;
04100			END ;
04200		GRPOLX ← 0 ;
04300		END "SAME PAGE" ;
04400	DAPART ; RETURN(TRUE) ;
04500	END "MOVEGROUP" ;
     

00100	PUBLIC RECURSIVE PROCEDURE TOCOLUMN(INTEGER COLNO) ;$"#
00200	IF ON THEN
00300	BEGIN "TOCOLUMN"
00400	ASSUREAREA ;
00500	IF COLNO < COL OR (COLNO=COL AND LINE) OR TES 10/25/73; COLNO>COLS   THEN NEXTPAGE ;
00600	IF 1 LEQ COLNO LEQ COLS THEN COL←COLNO ELSE
00700		BEGIN TES 10/25/73;
00800		WARN(NULL, "SKIP to nonexistent column "&CVS(COLNO));
00900		COLNO ← 1 ;
01000		END ;
01100	LINE ← 0 ; IF COL>1 THEN OPENAREA(AREAIXM) ;
01200	END "TOCOLUMN" ;
     

00100	FINISHED
00200	
00300	ENDOF("COLMS")